]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st-theme-node: reuse box-shadow materials between paint states when possible
authorLionel Landwerlin <llandwerlin@gmail.com>
Thu, 4 Jul 2013 13:26:08 +0000 (14:26 +0100)
committerLionel Landwerlin <llandwerlin@gmail.com>
Tue, 9 Jul 2013 10:25:24 +0000 (11:25 +0100)
src/st/st-theme-node-drawing.c
src/st/st-theme-node-private.h
src/st/st-theme-node.c

index 683e9f0a3cb843ff75872f17669a2746386fef55..438802993d781f5866817bcda97ee9042372482f 100644 (file)
@@ -1478,6 +1478,19 @@ st_theme_node_render_resources (StThemeNodePaintState *state,
       else if (node->background_color.alpha > 0 || has_border)
         st_theme_node_prerender_shadow (state);
     }
+
+  /* If we don't have cached textures yet, check whether we can cache
+     them. */
+  if (!node->cached_textures)
+    {
+      if (state->prerendered_material == COGL_INVALID_HANDLE &&
+          width >= node->box_shadow_min_width &&
+          height >= node->box_shadow_min_height)
+        {
+          st_theme_node_paint_state_copy (&node->cached_state, state);
+          node->cached_textures = TRUE;
+        }
+    }
 }
 
 static void
@@ -2371,12 +2384,22 @@ st_theme_node_paint (StThemeNode           *node,
     return;
 
   if (st_theme_node_needs_new_box_shadow_for_size (state, node, width, height))
-    st_theme_node_render_resources (state, node, width, height);
+    {
+      /* If we had the ability to cache textures on the node, then we
+         can just copy them over to the paint state and avoid all
+         rendering. We end up sharing textures a cross different
+         widgets. */
+      if (node->rendered_once && node->cached_textures &&
+          width >= node->box_shadow_min_width && height >= node->box_shadow_min_height)
+        st_theme_node_paint_state_copy (state, &node->cached_state);
+      else
+        st_theme_node_render_resources (state, node, width, height);
+
+      node->rendered_once = TRUE;
+    }
   else
     st_theme_node_update_resources (state, node, width, height);
 
-  node->rendered_once = TRUE;
-
   /* Rough notes about the relationship of borders and backgrounds in CSS3;
    * see http://www.w3.org/TR/css3-background/ for more accurate details.
    *
index 9d6cf94172fadb88a95c62873ddcddd1472cf8f5..aba58a3437d14ae63cf46e313a6dc2b5123bed64 100644 (file)
@@ -100,6 +100,7 @@ struct _StThemeNode {
   guint text_shadow_computed : 1;
   guint link_type : 2;
   guint rendered_once : 1;
+  guint cached_textures : 1;
 
   int box_shadow_min_width;
   int box_shadow_min_height;
@@ -109,6 +110,8 @@ struct _StThemeNode {
   CoglHandle background_texture;
   CoglHandle background_material;
   CoglHandle background_shadow_material;
+
+  StThemeNodePaintState cached_state;
 };
 
 struct _StThemeNodeClass {
index 5250e8ac72523f80c88eae1ac832258a161f9119..9bfa39f50297b2ef7485b23fcfe8a71db9a9d4a4 100644 (file)
@@ -101,6 +101,8 @@ st_theme_node_dispose (GObject *gobject)
     g_signal_handlers_disconnect_by_func (node->theme,
                                           on_custom_stylesheets_changed, node);
 
+  st_theme_node_paint_state_free (&node->cached_state);
+
   g_clear_object (&node->theme);
 
   G_OBJECT_CLASS (st_theme_node_parent_class)->dispose (gobject);